/*
 * All credits goes to http://mobiforge.com/developing/story/sms-messaging-android
 */

package emt.friendtracking.smsmodule;

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import android.util.Base64;
import android.util.Log;

public class StringCryptor 
{
	private static final String CIPHER_ALGORITHM = "AES";
	private static final String RANDOM_GENERATOR_ALGORITHM = "SHA1PRNG";
	private static final int RANDOM_KEY_SIZE = 128;
	
	// Encrypts string and encode in Base64
	public static String encrypt( String password, String data ) throws Exception 
	{	Log.d("StringCryptor.java - 23", "entering");
		byte[] secretKey = generateKey( password.getBytes() );
	    byte[] clear = data.getBytes();
		Log.d("StringCryptor.java - 26", "reached here");
	    SecretKeySpec secretKeySpec = new SecretKeySpec( secretKey, CIPHER_ALGORITHM );
		Cipher cipher = Cipher.getInstance( CIPHER_ALGORITHM );
	    cipher.init( Cipher.ENCRYPT_MODE, secretKeySpec );

		Log.d("StringCryptor.java - 31", "reached here");
	    byte[] encrypted = cipher.doFinal( clear );
	    String encryptedString = Base64.encodeToString( encrypted, Base64.DEFAULT );
	    
		return encryptedString;
	}
	
	// Decrypts string encoded in Base64
	public static String decrypt( String password, String encryptedData ) throws Exception 
	{
		byte[] secretKey = generateKey( password.getBytes() );
		
		SecretKeySpec secretKeySpec = new SecretKeySpec( secretKey, CIPHER_ALGORITHM );
		Cipher cipher = Cipher.getInstance( CIPHER_ALGORITHM );
	    cipher.init( Cipher.DECRYPT_MODE, secretKeySpec );
	    
	    byte[] encrypted = Base64.decode( encryptedData, Base64.DEFAULT );
	    byte[] decrypted = cipher.doFinal( encrypted );
	    
		return new String( decrypted );
	}
	
	public static byte[] generateKey( byte[] seed ) throws Exception
	{
		KeyGenerator keyGenerator = KeyGenerator.getInstance( CIPHER_ALGORITHM );
		SecureRandom secureRandom = SecureRandom.getInstance( RANDOM_GENERATOR_ALGORITHM );
		secureRandom.setSeed( seed );
	    keyGenerator.init( RANDOM_KEY_SIZE, secureRandom );
	    SecretKey secretKey = keyGenerator.generateKey();
	    return secretKey.getEncoded();
	}
}
